package com.ipkiss.incomespringboot.controller;

import com.ipkiss.incomespringboot.common.Constants;
import com.ipkiss.incomespringboot.common.Result;
import com.ipkiss.incomespringboot.entity.FundEntity;
import com.ipkiss.incomespringboot.entity.OperateEntity;
import com.ipkiss.incomespringboot.service.impl.FundInfoService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author WuYongheng
 * @date 2024/5/12
 * @describe
 */
@RestController
@Slf4j
@RequestMapping("/fund")
public class FundController {
    @Resource
    FundInfoService fundInfoService;

    /**
     * 获取基金交易记录数据的接口。
     * 通过调用fundInfoService.getTableData()方法来获取基金详情数据。
     * 如果获取数据成功，则返回包含基金详情的Result对象；
     * 如果获取数据失败，则返回一个包含错误信息的Result对象。
     *
     * @return Result<List<OperateEntity>> 类型，包含获取到的基金详情数据或错误信息。
     */
    @GetMapping("/v1/getTableData")
    public Result<List<OperateEntity>> getTableData() {
        List<OperateEntity> fundDetails = fundInfoService.getTableData();
        if (fundDetails == null) {
            return Result.error(Constants.SERVER_ERROR_CN);
        }
        return Result.success("getTableData成功", fundDetails);
    }

    /**
     * 获取基金数据的接口。
     *
     * @return Result<List<FundEntity>> 类型，包含获取的数据或错误信息。成功时，data字段包含基金详情数据；失败时，msg字段包含错误消息。
     */
    @GetMapping("/v1/getFundsData")
    public Result<List<FundEntity>> getFundsData() {
        List<FundEntity> fundDetails = fundInfoService.getFundsData();
        if (fundDetails == null) {
            return Result.error(Constants.SERVER_ERROR_CN);
        }
        return Result.success("getTableData成功", fundDetails);
    }

    /**
     * 创建交易记录信息
     *
     * @param operateEntity 包含操作信息的实体对象，通过RequestBody接收前端传来的JSON数据
     * @return 返回操作结果，如果操作成功，则返回成功信息和操作码；如果操作失败，则返回错误信息和错误码。
     */
    @ResponseBody
    @PostMapping("/v1/createInfo")
    public Result<Integer> createInfo(@RequestBody OperateEntity operateEntity) {
        if (operateEntity == null) {
            return Result.error("operateEntity不能为空");
        }
        int code = fundInfoService.createOperateInfo(operateEntity);
        if (code != Constants.SUCCESS_CODE) {
            return Result.error("createInfo失败");
        }
        return Result.success("创建交易记录成功", code);
    }

    /**
     * 更新操作信息接口。
     *
     * @param operateEntity 操作实体对象，包含需要更新的操作信息。不能为空。
     * @return 返回操作结果，成功则返回结果对象包含更新成功的信息和操作结果码；失败则返回错误信息和错误码。
     */
    @ResponseBody
    @PostMapping("/v1/updateInfo")
    public Result<Integer> updateInfo(@RequestBody OperateEntity operateEntity) {
        if (operateEntity == null) {
            return Result.error("operateEntity不能为空");
        }
        int code = fundInfoService.updateOperateInfo(operateEntity);
        if (code != Constants.SUCCESS_CODE) {
            return Result.error("updateInfo失败");
        } else {
            return Result.success("更新交易记录成功", code);
        }
    }

    @ResponseBody
    @DeleteMapping("/v1/deleteInfoById/{operateId}")
    public Result<Integer> deleteInfoById(@PathVariable int operateId) {
        if (operateId == 0) {
            return Result.error("operateId不能为空");
        }
        int code = fundInfoService.deleteOperateInfo(operateId);
        if (code != Constants.SUCCESS_CODE) {
            return Result.error("deleteInfoById失败");
        }
        return Result.success("删除交易记录成功", code);
    }

    /**
     * 根据基金名称关键字获取基金列表信息。
     *
     * @param keyword 基金名称的关键字，用于查询基金列表。
     * @return 返回操作结果，如果成功返回基金列表，失败则返回错误信息。
     */
    @ResponseBody
    @PostMapping("/v1/getFundListByKeyword/{keyword}")
    public Result<List<OperateEntity>> getFundListByKeyword(@PathVariable String keyword) {
        if (keyword.isEmpty()) {
            return Result.error("keyword不能为空");
        }
        List<OperateEntity> fundDetails = fundInfoService.getFundListByKeyword(keyword);
        if (fundDetails != null) {
            return Result.success("查询基金列表成功", fundDetails);
        }
        return Result.error("查询基金列表失败");
    }

    /**
     * 获取资金总额
     *
     * @return Result<Double> 类型的结果，包含获取的资金总额或错误信息。如果获取成功，返回的资金总额将附带在结果中；
     * 如果获取失败，返回的错误信息会指示失败的原因。
     */
    @GetMapping("/v1/getSumMoney")
    public Result<Double> getSumMoney() {
        double sumMoney = fundInfoService.getSumMoney();
        if (sumMoney > 0) {
            return Result.success("获取定投总金额成功", sumMoney);
        }
        return Result.error(Constants.SERVER_ERROR_CN);
    }
}
